package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流---传输对象---实现序列化接口Serializable：功能：将对象转换为二进制---使用率高
 *                            版本号：一定要写，对象写出，对象读入，必须统一版本号
 * ObjectOutputStream    对象输出流  写出---Person.java
 * ObjectInputStream     对象输入流  读入---Person.java
 */
public class ObjectIO {
    /**
     * ObjectOutputStream 对象输出流 /序列化
     * 序列化--对象转换为二进制
     */
    @Test
    public void testOOS() throws IOException {
        //传输对象：创建实现序列化接口的对象
        Person p=new Person();
        p.setNames("韩美娟");
            // String[] say=new String[]{}
            // 字符串数组:动态数组传输--给定元素决定数组长度
            p.setSay(new String[]{"百因必有果，你的报应就是我"});
            //    System.out.println(p);
            //创建低级流---写出  对象格式：person.obj
        FileOutputStream fos=null;
        ObjectOutputStream oos=null;
        try {
            fos= new FileOutputStream("person.obj");
            //高级流：ObjectOutputStream
            oos = new ObjectOutputStream(fos);
            /**
             * writeObject(Object obj)---写出对象
             * 作用：将给定对象按照其结构进行转换，转换为一组“组”字节，
             *      在通过处理的流写出，写出格式：xxx.obj
             *
             * 抛出异常：NotSerializableException 没有实现序列化接口
             * 原因：传输对象上没有实现Serializable序列化接口
             *
             * Person 类--- 去掉实现序列化接口： Serializable
             *
             * 对象文件写出操作需要经过2个步骤：(专业术语)
             * 1.通过对象输出流将Person类，转换为一组“组”字节，这个过长对象序列化
             * 2.将序列化后的每组的字节数据在通过字节流（低级流）写出到项目中（硬盘上）做长久
             *   的保存，这个过程：数据持久化！
             */
            oos.writeObject(p);
            System.out.println("写出成功~");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            oos.close();
        }
    }

    /**
     * ObjectInputStream 对象输入流 /反序列化
     * 反序列化---二进制转换为对象
     *
     * InvalidClassException  反序列化出现异常：版本号不匹配
     *
     * ClassNotFoundException  没有这个类型异常
     *                产生原因：读入对象不正确,永久保存，类型读入不对
     *                         person1.class  person.obj
     *                         person2.class
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
        ObjectInputStream ois=null;
        FileInputStream fis=null;
        try {
            //创建输入流---person.obj--读入
            fis=new FileInputStream("person.obj");
            //创建高级流---对象输入流
            ois=new ObjectInputStream(fis);
            //readObject() 返回读取的对象，反序列操作
            System.out.println(ois.readObject());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            ois.close();
        }
    }
}
